import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Reflection_demo2 {
    @Test
    public void getClassInfo(){
        Class c1 = Student.class;
        System.out.println(c1.getName());
        System.out.println();
    }

    // 构造器
    @Test
    public void getConstructorInfo() throws Exception{
        // 一、获取Class对象
        Class c1 = Dog.class;
        // 二、获取构造器类
        // 获取全部构造器
        Constructor[] cons = c1.getDeclaredConstructors();
        for (Constructor c : cons) {
            System.out.println(c.getName()+'('+c.getParameterCount()+')');
        }

        // 获取单个构造器
        // 获取无参构造器
        Constructor con_1 = c1.getDeclaredConstructor();
        System.out.println(con_1.getName()+'('+con_1.getParameterCount()+')');
        // 获取有参构造器
        Constructor con_2 = c1.getDeclaredConstructor(String.class,int.class);
        System.out.println(con_2.getName()+'('+con_2.getParameterCount()+')');

        // 三、获取构造器对象
        // 越权
        con_1.setAccessible(true);
        Dog d1 = (Dog)con_2.newInstance("小黑",3);
        System.out.println(d1);
    }

    // 成员变量
    @Test
    public void getFieldInfo() throws Exception{
        // 一、获取Class对象
        Class c1 = Dog.class;
        // 二、获取成员变量类
        // 获取全部成员变量
        Field fields[] = c1.getDeclaredFields();
        for (Field f : fields) {
            System.out.println(f.getName()+'('+f.getType()+')');
        }

        // 获取单个成员变量
        Field field = c1.getDeclaredField("name");
        System.out.println(field.getName()+'('+field.getType()+')');

        // 三、操作成员变量
        Dog d = new Dog("泰迪",3);
        field.setAccessible(true);
        field.set(d,"社交");

        System.out.println(field.get(d));
    }

    // 成员方法
    @Test
    public void getMethodInfo() throws Exception{
        // 一、获取Class对象
        Class c1 = Dog.class;
        // 二、获取成员方法类
        // 获取全部成员方法
        Method methods[] = c1.getDeclaredMethods();
        for (Method m : methods) {
            System.out.println(m.getName()+'('+m.getParameterCount()+')');
        }
        System.out.println("=======================");
        // 获取单个成员方法
        // 获取无参成员方法
        Method method_1 = c1.getDeclaredMethod("eat");
        System.out.println(method_1.getName()+'('+method_1.getParameterCount()+')');
        // 获取有参成员方法
        Method method = c1.getDeclaredMethod("eat",String.class);
        System.out.println(method.getName()+'('+method.getParameterCount()+')');

        System.out.println("=======================");
        // 三、操作成员方法
        Dog d = new Dog("泰迪",3);
        method.setAccessible(true);
        method.invoke(d,"骨头");
        method_1.invoke(d);
    }
}
